Skip to content

寄生式继承(推荐 Es6,过时禁止使用的)

寄生式继承是一种继承模式,它通过在一个已有对象上添加方法或属性,然后返回该对象来实现继承。

  1. 寄生式继承

    • 寄生式继承是在原型式继承的基础上,对新对象进行扩展,然后返回新对象,从而实现继承。
    javascript
    function createChild(parent) {
      var child = Object.create(parent); // 原型式继承
      child.sayHello = function () {
        console.log("Hello, I am " + this.name);
      };
      return child;
    }
    var parent = {
      name: "Parent",
    };
    var child = createChild(parent); // 寄生式继承
    child.name = "Child";
    child.sayHello(); // 输出 "Hello, I am Child"

缺陷例子

  • 难以识别对象类型:由于寄生式继承返回的对象并不是通过构造函数创建的,因此无法通过 instanceof 操作符来准确识别对象的类型。

  • 缺乏封装性:与原型式继承类似,寄生式继承也无法直接访问父对象构造函数内部的私有属性和方法,导致缺乏封装性。

  • 存在对象间的耦合:由于寄生式继承是在已有对象上添加方法或属性,因此会导致对象之间的耦合性增加,容易造成对象间的依赖关系复杂化。

  • 原型链混乱:如果不正确地处理原型链,可能会导致原型链混乱,使得代码难以理解和维护。

  • 性能问题:由于寄生式继承通常涉及创建新的对象和复制属性或方法,可能会导致性能问题,尤其是在创建大量对象时。

js
// 父对象
var parent = {
  colors: ["red", "blue", "green"],
  sayHello: function () {
    console.log("Hello from Parent");
  },
};

// 寄生式继承
function createChild(obj) {
  // 通过 Object.create() 方法创建一个新对象,并以 obj 为原型
  var child = Object.create(obj);
  // 添加额外的方法或属性
  child.sayHi = function () {
    console.log("Hi from Child");
  };
  // 返回新对象
  return child;
}

// 创建子对象
var child1 = createChild(parent);
var child2 = createChild(parent);

// 问题1:难以识别对象类型
console.log(child1 instanceof Object); // 输出: true,但无法准确识别为子类类型

// 问题2:缺乏封装性
console.log(child1.sayHello); // 输出: function () { console.log("Hello from Parent"); }

// 问题3:存在对象间的耦合
child1.colors.push("yellow");
console.log(child2.colors); // 输出: ["red", "blue", "green", "yellow"]